#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>


//int main()
//{
//	//int* p = (int*)malloc(40);
//	//if (p == NULL)
//	//{
//	//	return 0;
//	//}
//	////使用
//	//int* p2 = (int*)realloc(p, 80);
//	//if (p2 != NULL)
//	//{
//	//	p = p2;
//	//}
//	int* p = realloc(NULL, 40);//malloc(40);
//	return 0;
//}

//int main()
//{
//	//1.对NULL指针的解引用操作
//	//int* p = malloc(40);
//	////对p进行相关的判断
//	//*p = 10;//malloc开辟空间失败-对NULL指针解引用
//
//	////2.对动态开辟空间的越界访问
//	//int* p = (int*)malloc(40);//10个int
//	//if (p == NULL)
//	//{
//	//	return 0;
//	//}
//	//int i = 0;
//	////越界
//	//for (i = 0; i <= 10; i++)
//	//{
//	//	*(p + i) = i;
//	//}
//	//free(p);
//	//p = NULL;
//
//	//3.对非动态开辟内存使用free释放
//	//int a = 10;
//	//int* p = &a;
//	////...
//	////3.对非动态开辟内存使用free释放
//	//free(p);
//	//p = NULL;
//	
//	//4.使用free释放一块动态开辟内存的一部分
//	//int* p = (int*)malloc(40);
//	//if (p == NULL)
//	//{
//	//	return 0;
//	//}
//	//int i = 0;
//	//for (i = 0; i < 10; i++)
//	//{
//	//	*p++ = i;
//	//}
//	////回收空间
//	//free(p);
//	//p = NULL;
//
//	//5.对同一块动态内存多次释放
//	int* p = (int*)malloc(40);
//	if (p == NULL)
//	{
//		return 0;
//	}
//	//使用
//	//释放
//	free(p);
//	free(p);
//
//	//6.动态开辟内存忘记释放（内存泄漏）
//	/*while (1)
//	{
//		malloc(1);
//	}*/
//
//	return 0;
//}

#include <string.h>

//void GetMemory(char* p)
//{
//	p = (char*)malloc(100);
//}
//
//void Test(void)
//{
//	char* str = NULL;
//	GetMemory(str);
//	strcpy(str, "hello world");
//	printf(str);
//}
//
//int main()
//{
//	Test();
//
//	/*char* str = "abcdef";
//	printf(str);
//	printf("%s\n", str);
//	printf("abcdef");*/
//
//	return 0;
//}

//改正一
//void GetMemory(char** p)
//{
//	*p = (char*)malloc(100);
//}
//
//void Test(void)
//{
//	char* str = NULL;
//	GetMemory(&str);
//	strcpy(str, "hello world");
//	printf(str);
//	free(str);
//	str = NULL;
//}
//
//int main()
//{
//	Test();
//
//	/*char* str = "abcdef";
//	printf(str);
//	printf("%s\n", str);
//	printf("abcdef");*/
//
//	return 0;
//}

//改正二
//char* GetMemory(char* p)
//{
//	p = (char*)malloc(100);
//	return p;
//}
//
//void Test(void)
//{
//	char* str = NULL;
//	str = GetMemory(str);
//	strcpy(str, "hello world");
//	printf(str);
//	free(str);
//	str = NULL;
//
//}
//
//int main()
//{
//	Test();
//
//	/*char* str = "abcdef";
//	printf(str);
//	printf("%s\n", str);
//	printf("abcdef");*/
//
//	return 0;
//}

char* GetMemory(void)
{
	char p[] = "hello world";
	return p;
}

void Test(void)
{
	char* str = NULL;
	str = GetMemory();
	printf(str);
}

int main()
{
	Test();
	return 0;
}

//int* test()
//{
//	//static int a = 10;//静态区
//    int a = 10;//栈区
//	return &a;
//}
//int main()
//{
//	int* p = test();
//	*p = 20;
//	return 0;
//}

//int* test()
//{
//	int* ptr = malloc(100);
//	return ptr;
//}
//int main()
//{
//	int* p = test();
//	return 0;
//}

//void GetMemory(char** p, int num)
//{
//	*p = (char*)malloc(num);
//}
//void Test(void)
//{
//	char* str = NULL;
//	GetMemory(&str, 100);
//	strcpy(str, "hello");
//	printf(str);
//	free(str);
//	str = NULL;
//
//}
//
//int main()
//{
//	Test();
//	return 0;
//}

//void Test(void)
//{
//	char* str = (char*)malloc(100);
//	strcpy(str, "hello");	
//	free(str);
//	str = NULL;
//
//	if (str != NULL)
//	{
//		strcpy(str, "world");
//		printf(str);
//	}
//
//}
//
//int main()
//{
//	Test();
//
//	return 0;
//}